package com.miukoo.aikao.qexam.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.miukoo.aikao.core.dtos.PageReqDto;
import com.miukoo.aikao.core.enums.JoinType;
import com.miukoo.aikao.core.enums.OpenType;
import com.miukoo.aikao.core.exceptions.ApiException;
import com.miukoo.aikao.core.utils.BeanMapperUtils;
import com.miukoo.aikao.qexam.api.v1.ExamApi;
import com.miukoo.aikao.core.dtos.ExamDto;
import com.miukoo.aikao.qexam.dto.ExamRepoDto;
import com.miukoo.aikao.qexam.dto.request.ExamSaveReqDto;
import com.miukoo.aikao.qexam.dto.response.ExamOnlineRespDto;
import com.miukoo.aikao.qexam.dto.response.ExamReviewRespDto;
import com.miukoo.aikao.qexam.mapper.ExamMapper;
import com.miukoo.aikao.qexam.pojos.Exam;
import com.miukoo.aikao.qexam.service.ExamDepartService;
import com.miukoo.aikao.qexam.service.ExamRepoService;
import com.miukoo.aikao.qexam.service.ExamService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;

import java.util.List;

/**
* <p>
* 考试业务实现类
* </p>
*
* @author 聪明笨狗
* @since 2020-07-25 16:18
*/
@Service
public class ExamServiceImpl extends ServiceImpl<ExamMapper, Exam> implements ExamService, ExamApi {


    @Autowired
    private ExamRepoService examRepoService;

    @Autowired
    private ExamDepartService examDepartService;

    @Override
    public void save(ExamSaveReqDto reqDto) {

        // ID
        Long id = reqDto.getId();

        if(id==null){
            id = Long.valueOf(IdWorker.getIdStr());
        }

        //复制参数
        Exam entity = new Exam();

        // 计算分值
        this.calcScore(reqDto);


        // 复制基本数据
        BeanMapperUtils.copy(reqDto, entity);
        entity.setId(id);

        if (reqDto.getTimeLimit()==null && !reqDto.getTimeLimit() && reqDto.getState() == null) { //不限时 且 状态还是未开始的 把状态改为 进行中
            entity.setState((short)0);
        } else {
            entity.setState(reqDto.getState());
        }

        // 题库组卷
        if(JoinType.REPO_JOIN.equals(reqDto.getJoinType())){
            try {
                examRepoService.saveAll(id, reqDto.getRepoList());
            }catch (DuplicateKeyException e){
                throw new ApiException(1, "不能选择重复的题库！");
            }
        }

        // 开放的部门
        if(OpenType.DEPT_OPEN.equals(reqDto.getOpenType())){
            examDepartService.saveAll(id, reqDto.getDepartIds());
        }



        this.saveOrUpdate(entity);

    }

    @Override
    public ExamSaveReqDto findDetail(Long id) {
        ExamSaveReqDto respDto = new ExamSaveReqDto();
        Exam exam = this.getById(id);
        BeanMapperUtils.copy(exam, respDto);

        // 考试部门
        List<Long> departIds = examDepartService.listByExam(id);
        respDto.setDepartIds(departIds);

        // 题库
        List<ExamRepoDto> repos = examRepoService.listByExam(id);
        respDto.setRepoList(repos);

        return respDto;
    }

    @Override
    public ExamDto findById(Long id) {
        ExamDto respDto = new ExamDto();
        Exam exam = this.getById(id);
        BeanMapperUtils.copy(exam, respDto);
        return respDto;
    }

    @Override
    public IPage<ExamDto> paging(PageReqDto<ExamDto> reqDto) {

        //创建分页对象
        Page page = new Page(reqDto.getCurrent(), reqDto.getSize());

        //转换结果
        IPage<ExamDto> pageData = baseMapper.paging(page, reqDto.getParams());
        return pageData;
     }

    @Override
    public IPage<ExamOnlineRespDto> onlinePaging(PageReqDto<ExamDto> reqDto, Long userId) {


        // 创建分页对象
        Page page = new Page(reqDto.getCurrent(), reqDto.getSize());

        // 查找分页
        IPage<ExamOnlineRespDto> pageData = baseMapper.online(page, reqDto.getParams(),userId);

        return pageData;
    }

    @Override
    public IPage<ExamReviewRespDto> reviewPaging(PageReqDto<ExamDto> reqDto) {
        // 创建分页对象
        Page page = new Page(reqDto.getCurrent(), reqDto.getSize());

        // 查找分页
        IPage<ExamReviewRespDto> pageData = baseMapper.reviewPaging(page, reqDto.getParams());

        return pageData;
    }


    /**
     * 计算分值
     * @param reqDto
     */
    private void calcScore(ExamSaveReqDto reqDto){

        // 主观题分数
        short objScore = 0;

        // 题库组卷
        if(JoinType.REPO_JOIN.equals(reqDto.getJoinType())){
            List<ExamRepoDto> repoList = reqDto.getRepoList();

            for(ExamRepoDto item: repoList){
                if(item.getRadioCount()!=null
                        && item.getRadioCount()>0
                        && item.getRadioScore()!=null
                        && item.getRadioScore()>0){
                    objScore+=item.getRadioCount()*item.getRadioScore();
                }
                if(item.getMultiCount()!=null
                        && item.getMultiCount()>0
                        && item.getMultiScore()!=null
                        && item.getMultiScore()>0){
                    objScore+=item.getMultiCount()*item.getMultiScore();
                }
                if(item.getJudgeCount()!=null
                        && item.getJudgeCount()>0
                        && item.getJudgeScore()!=null
                        && item.getJudgeScore()>0){
                    objScore+=item.getJudgeCount()*item.getJudgeScore();
                }
                if(item.getQaCount()!=null
                        && item.getQaCount()>0
                        && item.getQaScore()!=null
                        && item.getQaScore()>0){
                    objScore+=item.getQaCount()*item.getQaScore();
                }
                if(item.getCodingCount()!=null
                        && item.getCodingCount()>0
                        && item.getCodingScore()!=null
                        && item.getCodingScore()>0){
                    objScore+=item.getCodingCount()*item.getCodingScore();
                }
            }
        }


        reqDto.setTotalScore(objScore);
    }

}
